From: Florian Müllner Date: Thu, 6 Oct 2016 21:32:08 +0000 (+0200) Subject: altTab: Consider attached modals for window order X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~697 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=d4ce51b1b78197def929db329b7e8f4e0d3cec2e;p=gnome-shell.git altTab: Consider attached modals for window order Similar to bug 667552 for the app switcher, attached modal dialogs can result in an unexpected window order in the window switcher: Selecting a window with an attached dialog will focus the dialog instead, but as the dialog itself is ignored in the window list, its last-used timestamp is not taken into account for the position in the MRU list. Fix this by fetching the list of all NORMAL windows and filter out skip-taskbar windows ourselves, while making sure that windows appear in the position of their attached modal dialog where appropriate. https://bugzilla.gnome.org/show_bug.cgi?id=747153 --- diff --git a/js/ui/altTab.js b/js/ui/altTab.js index dfdf9c3f9..d10133568 100644 --- a/js/ui/altTab.js +++ b/js/ui/altTab.js @@ -46,6 +46,19 @@ function _createWindowClone(window, size) { y_expand: true }); }; +function getWindows(workspace) { + // We ignore skip-taskbar windows in switchers, but if they are attached + // to their parent, their position in the MRU list may be more appropriate + // than the parent; so start with the complete list ... + let windows = global.display.get_tab_list(Meta.TabList.NORMAL_ALL, + workspace); + // ... map windows to their parent where appropriate ... + return windows.map(w => { + return w.is_attached_dialog() ? w.get_transient_for() : w; + // ... and filter out skip-taskbar windows and duplicates + }).filter((w, i, a) => !w.skip_taskbar && a.indexOf(w) == i); +} + const AppSwitcherPopup = new Lang.Class({ Name: 'AppSwitcherPopup', Extends: SwitcherPopup.SwitcherPopup, @@ -517,7 +530,7 @@ const WindowSwitcherPopup = new Lang.Class({ _getWindowList: function() { let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null; - return global.display.get_tab_list(Meta.TabList.NORMAL, workspace); + return getWindows(workspace); }, _keyPressHandler: function(keysym, action) { @@ -555,7 +568,7 @@ const WindowCyclerPopup = new Lang.Class({ _getWindows: function() { let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null; - return global.display.get_tab_list(Meta.TabList.NORMAL, workspace); + return getWindows(workspace); }, _keyPressHandler: function(keysym, action) {